本文为您介绍如何开启SparkSQL合并小文件功能,以及支持的SQL语句。
开启小文件合并功能
开启小文件合并功能后,SparkSQL的写入操作(例如insert、create table等)将自动合并生成的输出文件,但功能只作用于当前写入操作生成的文件,不会对历史数据进行合并。同时,该功能支持非分区表以及静态、动态分区写入。EMR-5.5.0之后版本和EMR-3.39.0之后版本的Spark3支持非分区表以及静态分区写入,EMR-5.10.0之后版本和EMR-3.44.0之后版本的Spark3支持动态分区写入。
您还可以新增参数spark.sql.adaptive.advisoryOutputFileSizeInBytes,调整写表之前插入的Shuffle的分区大小,默认值为256 MB。该参数会影响最终文件的大小。
进入集群服务页面。
登录EMR on ECS。
在顶部菜单栏处,根据实际情况选择地域和资源组。
在EMR on ECS页面,单击目标集群操作列的集群服务。
新增配置项。
在集群服务页面,单击Spark3服务区域的配置。
单击spark-thriftserver.conf页签。
单击新增配置项。
输入Key为spark.sql.adaptive.merge.output.small.files.enabled,Value为true的配置项。
单击确定。
在弹出的对话中,输入执行原因,单击保存。
重启SparkThriftServer。
在集群服务页面,单击状态页签。
在组件列表区域,单击SparkThriftServer操作列的重启。
在弹出的对话框中,输入执行原因,单击确定。
在确认对话框中,单击确定。
支持的SQL
支持以下类型的SQL语句,示例如下所示:
INSERT INTO table_a SELECT * FROM table_b
CREATE TABLE table_a AS SELECT * FROM table_b
INSERT OVERWRITE TABLE table_c PARTITION (dt=20221228) SELECT * FROM table_d
INSERT INTO table_c PARTITION (dt=20221228) SELECT * FROM table_d
INSERT OVERWRITE TABLE table_c PARTITION (dt) SELECT * FROM table_d
INSERT INTO table_c PARTITION (dt) SELECT * FROM table_d